{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import keras\n",
    "import tensorflow as tf\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Input, Dense, Dropout, Conv2D, MaxPool2D, Flatten, AveragePooling2D, GlobalAvgPool2D"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:49.815736600Z",
     "start_time": "2024-01-14T14:08:45.164039400Z"
    }
   },
   "id": "initial_id"
  },
  {
   "cell_type": "markdown",
   "source": [
    "# Inception模块"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "a16c36f6fb36c8d1"
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [],
   "source": [
    "class inception(keras.layers.Layer):\n",
    "\n",
    "    def __init__(self, c1, c2, c3, c4):\n",
    "        super().__init__()\n",
    "        # 线路1 1*1\n",
    "        self.p1_1 = Conv2D(c1, kernel_size=1, activation=\"relu\", padding=\"same\")\n",
    "\n",
    "        # 线路2 1*1\n",
    "        self.p2_1 = Conv2D(c2[0], kernel_size=1, activation=\"relu\", padding=\"same\")\n",
    "        # 线路2 3*3\n",
    "        self.p2_2 = Conv2D(c2[1], kernel_size=3, activation=\"relu\", padding=\"same\")\n",
    "\n",
    "        # 线路3 1*1\n",
    "        self.p3_1 = Conv2D(c3[0], kernel_size=1, activation=\"relu\", padding=\"same\")\n",
    "        # 线路2 3*3\n",
    "        self.p3_2 = Conv2D(c3[1], kernel_size=5, activation=\"relu\", padding=\"same\")\n",
    "\n",
    "        # 线路4 maxpool \n",
    "        self.p4_1 = MaxPool2D(pool_size=3, padding=\"same\", strides=1)\n",
    "        self.p4_2 = Conv2D(c4, kernel_size=1, activation=\"relu\", padding=\"same\")\n",
    "\n",
    "    def call(self, x):\n",
    "        \"\"\"\n",
    "        前行传播过程\n",
    "        :param x: \n",
    "        :return: \n",
    "        \"\"\"\n",
    "        # 线路1\n",
    "        p1 = self.p1_1(x)\n",
    "        # 线路2\n",
    "        p2 = self.p2_2(self.p2_1(x))\n",
    "        # 线路3\n",
    "        p3 = self.p3_2(self.p3_1(x))\n",
    "        # 线路4\n",
    "        p4 = self.p4_2(self.p4_1(x))\n",
    "        return tf.concat([p1, p2, p3, p4], axis=-1)\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:49.842041300Z",
     "start_time": "2024-01-14T14:08:49.828428200Z"
    }
   },
   "id": "b6779f207387aa13"
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "data": {
      "text/plain": "<__main__.inception at 0x14ab90345b0>"
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 线路1，64个卷积核\n",
    "# 线路2,96、128个卷积核……\n",
    "inception(64, (96, 128), (16, 32), 32)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:49.871025700Z",
     "start_time": "2024-01-14T14:08:49.835045800Z"
    }
   },
   "id": "9dff4de71c010278"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## GoogLeNet构建"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "f28935f1794a9598"
  },
  {
   "cell_type": "markdown",
   "source": [
    "### B1模块"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "dcd3547e839868ec"
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [],
   "source": [
    "inpt = Input(shape=(224, 224, 1), name=\"inpt\")\n",
    "# 卷积\n",
    "x = Conv2D(64, kernel_size=7, strides=2, padding=\"same\", activation=\"relu\")(inpt)\n",
    "# 池化\n",
    "x = MaxPool2D(pool_size=3, strides=2, padding=\"same\")(x)\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:49.969971200Z",
     "start_time": "2024-01-14T14:08:49.869025200Z"
    }
   },
   "id": "17ff6cee2a6f8a5a"
  },
  {
   "cell_type": "markdown",
   "source": [
    "### B2模块"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "860c22d9754a0131"
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [],
   "source": [
    "x = Conv2D(64, kernel_size=1, padding=\"same\", activation=\"relu\")(x)\n",
    "x = Conv2D(192, kernel_size=3, padding=\"same\", activation=\"relu\")(x)\n",
    "x = MaxPool2D(pool_size=3, strides=2, padding=\"same\")(x)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:50.017941200Z",
     "start_time": "2024-01-14T14:08:49.973967800Z"
    }
   },
   "id": "889fc991bad122ec"
  },
  {
   "cell_type": "markdown",
   "source": [
    "### B3模块"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "f6c86a2edd25b3c1"
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [],
   "source": [
    "x = inception(64, (96, 128), (16, 32), 32)(x)\n",
    "x = inception(128, (128, 192), (32, 96), 64)(x)\n",
    "x = MaxPool2D(pool_size=3, strides=2, padding=\"same\")(x)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:50.286853100Z",
     "start_time": "2024-01-14T14:08:50.021939400Z"
    }
   },
   "id": "ed1c3c2eb451a80c"
  },
  {
   "cell_type": "markdown",
   "source": [
    "### B4模块"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "4f5c3b7c34f3eb38"
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [],
   "source": [
    "# 辅助分类器\n",
    "def aux_classifier(x, filter_size):\n",
    "    x = AveragePooling2D(pool_size=5, strides=3, padding=\"same\")(x)\n",
    "    x = Conv2D(filters=filter_size[0], kernel_size=1, strides=1, padding=\"valid\", activation=\"relu\")(x)\n",
    "    x = Flatten()(x)\n",
    "    # units神经元个数\n",
    "    x = Dense(units=filter_size[1], activation=\"relu\")(x)\n",
    "    x = Dense(units=10, activation=\"softmax\")(x)\n",
    "    return x"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:50.305840900Z",
     "start_time": "2024-01-14T14:08:50.295847300Z"
    }
   },
   "id": "1bc5b0b2e1ff11a6"
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [],
   "source": [
    "x = inception(192, (96, 208), (16, 48), 64)(x)\n",
    "\n",
    "#辅助输出\n",
    "aux_output1 = aux_classifier(x, [128, 1024])\n",
    "\n",
    "x = inception(160, (112, 224), (24, 64), 64)(x)\n",
    "x = inception(128, (128, 256), (24, 64), 64)(x)\n",
    "x = inception(112, (144, 288), (32, 64), 64)(x)\n",
    "\n",
    "#辅助输出\n",
    "aux_output2 = aux_classifier(x, [128, 1024])\n",
    "\n",
    "x = inception(256, (160, 320), (32, 128), 128)(x)\n",
    "\n",
    "x = MaxPool2D(pool_size=3, strides=2, padding=\"same\")(x)\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:50.881673300Z",
     "start_time": "2024-01-14T14:08:50.307840900Z"
    }
   },
   "id": "ab249f867926ee95"
  },
  {
   "cell_type": "markdown",
   "source": [
    "### B5模块"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "222d31fb23c1190f"
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [],
   "source": [
    "x = inception(256, (160, 320), (32, 128), 128)(x)\n",
    "x = inception(384, (192, 384), (48, 128), 128)(x)\n",
    "#GAP\n",
    "x = GlobalAvgPool2D()(x)\n",
    "output = Dense(10, activation=\"softmax\")(x)\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:51.082265800Z",
     "start_time": "2024-01-14T14:08:50.895974100Z"
    }
   },
   "id": "8fc897b6954e100e"
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [],
   "source": [
    "model = keras.Model(inputs=inpt, outputs=[output, aux_output1, aux_output2])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:51.130144300Z",
     "start_time": "2024-01-14T14:08:51.092259300Z"
    }
   },
   "id": "97151eff12b21328"
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model\"\n",
      "__________________________________________________________________________________________________\n",
      " Layer (type)                   Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      " inpt (InputLayer)              [(None, 224, 224, 1  0           []                               \n",
      "                                )]                                                                \n",
      "                                                                                                  \n",
      " conv2d_6 (Conv2D)              (None, 112, 112, 64  3200        ['inpt[0][0]']                   \n",
      "                                )                                                                 \n",
      "                                                                                                  \n",
      " max_pooling2d_1 (MaxPooling2D)  (None, 56, 56, 64)  0           ['conv2d_6[0][0]']               \n",
      "                                                                                                  \n",
      " conv2d_7 (Conv2D)              (None, 56, 56, 64)   4160        ['max_pooling2d_1[0][0]']        \n",
      "                                                                                                  \n",
      " conv2d_8 (Conv2D)              (None, 56, 56, 192)  110784      ['conv2d_7[0][0]']               \n",
      "                                                                                                  \n",
      " max_pooling2d_2 (MaxPooling2D)  (None, 28, 28, 192)  0          ['conv2d_8[0][0]']               \n",
      "                                                                                                  \n",
      " inception_1 (inception)        (None, 28, 28, 256)  163696      ['max_pooling2d_2[0][0]']        \n",
      "                                                                                                  \n",
      " inception_2 (inception)        (None, 28, 28, 480)  388736      ['inception_1[0][0]']            \n",
      "                                                                                                  \n",
      " max_pooling2d_5 (MaxPooling2D)  (None, 14, 14, 480)  0          ['inception_2[0][0]']            \n",
      "                                                                                                  \n",
      " inception_3 (inception)        (None, 14, 14, 512)  376176      ['max_pooling2d_5[0][0]']        \n",
      "                                                                                                  \n",
      " inception_4 (inception)        (None, 14, 14, 512)  449160      ['inception_3[0][0]']            \n",
      "                                                                                                  \n",
      " inception_5 (inception)        (None, 14, 14, 512)  510104      ['inception_4[0][0]']            \n",
      "                                                                                                  \n",
      " inception_6 (inception)        (None, 14, 14, 528)  605376      ['inception_5[0][0]']            \n",
      "                                                                                                  \n",
      " inception_7 (inception)        (None, 14, 14, 832)  868352      ['inception_6[0][0]']            \n",
      "                                                                                                  \n",
      " max_pooling2d_11 (MaxPooling2D  (None, 7, 7, 832)   0           ['inception_7[0][0]']            \n",
      " )                                                                                                \n",
      "                                                                                                  \n",
      " average_pooling2d (AveragePool  (None, 5, 5, 512)   0           ['inception_3[0][0]']            \n",
      " ing2D)                                                                                           \n",
      "                                                                                                  \n",
      " average_pooling2d_1 (AveragePo  (None, 5, 5, 528)   0           ['inception_6[0][0]']            \n",
      " oling2D)                                                                                         \n",
      "                                                                                                  \n",
      " inception_8 (inception)        (None, 7, 7, 832)    1043456     ['max_pooling2d_11[0][0]']       \n",
      "                                                                                                  \n",
      " conv2d_27 (Conv2D)             (None, 5, 5, 128)    65664       ['average_pooling2d[0][0]']      \n",
      "                                                                                                  \n",
      " conv2d_46 (Conv2D)             (None, 5, 5, 128)    67712       ['average_pooling2d_1[0][0]']    \n",
      "                                                                                                  \n",
      " inception_9 (inception)        (None, 7, 7, 1024)   1444080     ['inception_8[0][0]']            \n",
      "                                                                                                  \n",
      " flatten (Flatten)              (None, 3200)         0           ['conv2d_27[0][0]']              \n",
      "                                                                                                  \n",
      " flatten_1 (Flatten)            (None, 3200)         0           ['conv2d_46[0][0]']              \n",
      "                                                                                                  \n",
      " global_average_pooling2d (Glob  (None, 1024)        0           ['inception_9[0][0]']            \n",
      " alAveragePooling2D)                                                                              \n",
      "                                                                                                  \n",
      " dense (Dense)                  (None, 1024)         3277824     ['flatten[0][0]']                \n",
      "                                                                                                  \n",
      " dense_2 (Dense)                (None, 1024)         3277824     ['flatten_1[0][0]']              \n",
      "                                                                                                  \n",
      " dense_4 (Dense)                (None, 10)           10250       ['global_average_pooling2d[0][0]'\n",
      "                                                                 ]                                \n",
      "                                                                                                  \n",
      " dense_1 (Dense)                (None, 10)           10250       ['dense[0][0]']                  \n",
      "                                                                                                  \n",
      " dense_3 (Dense)                (None, 10)           10250       ['dense_2[0][0]']                \n",
      "                                                                                                  \n",
      "==================================================================================================\n",
      "Total params: 12,687,054\n",
      "Trainable params: 12,687,054\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:51.285056100Z",
     "start_time": "2024-01-14T14:08:51.117151Z"
    }
   },
   "id": "ea1543ca1512c680"
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "outputs": [],
   "source": [
    "from keras.datasets import mnist\n",
    "\n",
    "(train_image, train_label), (test_image, test_label) = mnist.load_data()\n",
    "\n",
    "# 维度调整,转换成(60000, 28, 28, 1)\n",
    "train_image = np.reshape(train_image,  # 数据源\n",
    "                         (\n",
    "                             train_image.shape[0],\n",
    "                             train_image.shape[1],\n",
    "                             train_image.shape[2],\n",
    "                             1  # 通道数1\n",
    "                         ))\n",
    "# 维度调整,转换成(60000, 28, 28, 1)\n",
    "test_image = np.reshape(test_image,  # 数据源\n",
    "                        (\n",
    "                            test_image.shape[0],\n",
    "                            test_image.shape[1],\n",
    "                            test_image.shape[2],\n",
    "                            1  # 通道数1\n",
    "                        ))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:51.540910Z",
     "start_time": "2024-01-14T14:08:51.217094500Z"
    }
   },
   "id": "989d22285b679a46"
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "outputs": [],
   "source": [
    "# 对训练数据进行抽样 可以不用\n",
    "def get_train(size):\n",
    "    # 随机生成index\n",
    "    index = np.random.randint(0, train_image.shape[0], size)\n",
    "    # 选择图像进行resize\n",
    "    resized_image = tf.image.resize_with_pad(train_image[index], 224, 224)\n",
    "    return resized_image.numpy(), train_label[index]\n",
    "\n",
    "# 对测试数据进行抽样 可以不用\n",
    "def get_test(size):\n",
    "    # 随机生成index\n",
    "    index = np.random.randint(0, test_image.shape[0], size)\n",
    "    # 选择图像进行resize\n",
    "    resized_image = tf.image.resize_with_pad(test_image[index], 224, 224)\n",
    "    return resized_image.numpy(), test_label[index]\n",
    "\n",
    "# 抽样结果\n",
    "train_image, train_label = get_train(256)\n",
    "test_image, test_label = get_test(128)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:51.722951100Z",
     "start_time": "2024-01-14T14:08:51.550904300Z"
    }
   },
   "id": "d38fcd1363c52ddb"
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "outputs": [],
   "source": [
    "# 因为太慢，，所以要抽取部分的数据，否则会很慢！！！\n",
    "# train_image = tf.image.resize_with_pad(train_image[:], 224, 224)\n",
    "# test_image = tf.image.resize_with_pad(test_image[:], 224, 224)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:51.734948700Z",
     "start_time": "2024-01-14T14:08:51.714930300Z"
    }
   },
   "id": "4e7497d5eec4051e"
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "outputs": [],
   "source": [
    "model.compile(\n",
    "    optimizer=tf.keras.optimizers.SGD(learning_rate=0.01,momentum=0.0),\n",
    "    loss=keras.losses.sparse_categorical_crossentropy,\n",
    "    metrics=[\"accuracy\"],\n",
    "    loss_weights=[1,0.3,0.3] # 3个输出，要指定权重\n",
    ")"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:08:52.006193400Z",
     "start_time": "2024-01-14T14:08:51.731955600Z"
    }
   },
   "id": "3384e3126aff83af"
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/5\n",
      "1/1 [==============================] - 16s 16s/step - loss: 4.8503 - dense_4_loss: 2.7829 - dense_1_loss: 4.0617 - dense_3_loss: 2.8297 - dense_4_accuracy: 0.1016 - dense_1_accuracy: 0.0352 - dense_3_accuracy: 0.1133 - val_loss: 4.3349 - val_dense_4_loss: 2.3816 - val_dense_1_loss: 4.1487 - val_dense_3_loss: 2.3624 - val_dense_4_accuracy: 0.0859 - val_dense_1_accuracy: 0.1484 - val_dense_3_accuracy: 0.0938\n",
      "Epoch 2/5\n",
      "1/1 [==============================] - 9s 9s/step - loss: 4.2411 - dense_4_loss: 2.3516 - dense_1_loss: 3.9503 - dense_3_loss: 2.3479 - dense_4_accuracy: 0.1016 - dense_1_accuracy: 0.1562 - dense_3_accuracy: 0.0898 - val_loss: 3.7547 - val_dense_4_loss: 2.3139 - val_dense_1_loss: 2.4891 - val_dense_3_loss: 2.3136 - val_dense_4_accuracy: 0.1094 - val_dense_1_accuracy: 0.1016 - val_dense_3_accuracy: 0.1328\n",
      "Epoch 3/5\n",
      "1/1 [==============================] - 9s 9s/step - loss: 3.7374 - dense_4_loss: 2.3076 - dense_1_loss: 2.4570 - dense_3_loss: 2.3091 - dense_4_accuracy: 0.1172 - dense_1_accuracy: 0.0977 - dense_3_accuracy: 0.1367 - val_loss: 3.6501 - val_dense_4_loss: 2.3022 - val_dense_1_loss: 2.2156 - val_dense_3_loss: 2.2773 - val_dense_4_accuracy: 0.0938 - val_dense_1_accuracy: 0.1953 - val_dense_3_accuracy: 0.1016\n",
      "Epoch 4/5\n",
      "1/1 [==============================] - 10s 10s/step - loss: 3.6540 - dense_4_loss: 2.2997 - dense_1_loss: 2.2303 - dense_3_loss: 2.2838 - dense_4_accuracy: 0.1055 - dense_1_accuracy: 0.1367 - dense_3_accuracy: 0.1172 - val_loss: 3.6161 - val_dense_4_loss: 2.2977 - val_dense_1_loss: 2.1259 - val_dense_3_loss: 2.2688 - val_dense_4_accuracy: 0.1328 - val_dense_1_accuracy: 0.3047 - val_dense_3_accuracy: 0.1172\n",
      "Epoch 5/5\n",
      "1/1 [==============================] - 10s 10s/step - loss: 3.6238 - dense_4_loss: 2.2960 - dense_1_loss: 2.1504 - dense_3_loss: 2.2756 - dense_4_accuracy: 0.1602 - dense_1_accuracy: 0.2461 - dense_3_accuracy: 0.1172 - val_loss: 3.6006 - val_dense_4_loss: 2.2951 - val_dense_1_loss: 2.0960 - val_dense_3_loss: 2.2559 - val_dense_4_accuracy: 0.0938 - val_dense_1_accuracy: 0.3438 - val_dense_3_accuracy: 0.1562\n"
     ]
    }
   ],
   "source": [
    "his = model.fit(train_image,\n",
    "                train_label,\n",
    "                batch_size=256,\n",
    "                epochs=5,\n",
    "                # validation_split=0.1,\n",
    "                validation_data=(test_image,test_label),\n",
    "                verbose=1\n",
    "                )"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:09:46.303379100Z",
     "start_time": "2024-01-14T14:08:52.000196900Z"
    }
   },
   "id": "3e70f7be75cf504b"
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4/4 [==============================] - 1s 205ms/step - loss: 3.6006 - dense_4_loss: 2.2951 - dense_1_loss: 2.0960 - dense_3_loss: 2.2559 - dense_4_accuracy: 0.0938 - dense_1_accuracy: 0.3438 - dense_3_accuracy: 0.1562\n"
     ]
    },
    {
     "data": {
      "text/plain": "[3.6006109714508057,\n 2.2950634956359863,\n 2.095966339111328,\n 2.255858898162842,\n 0.09375,\n 0.34375,\n 0.15625]"
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(test_image, test_label)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:12:30.283744500Z",
     "start_time": "2024-01-14T14:12:29.408148800Z"
    }
   },
   "id": "94cb4612cc9013b6"
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "F:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\IPython\\core\\events.py:89: UserWarning: Glyph 35757 (\\N{CJK UNIFIED IDEOGRAPH-8BAD}) missing from current font.\n",
      "  func(*args, **kwargs)\n",
      "F:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\IPython\\core\\events.py:89: UserWarning: Glyph 32451 (\\N{CJK UNIFIED IDEOGRAPH-7EC3}) missing from current font.\n",
      "  func(*args, **kwargs)\n",
      "F:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\IPython\\core\\events.py:89: UserWarning: Glyph 38598 (\\N{CJK UNIFIED IDEOGRAPH-96C6}) missing from current font.\n",
      "  func(*args, **kwargs)\n",
      "F:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\IPython\\core\\events.py:89: UserWarning: Glyph 27979 (\\N{CJK UNIFIED IDEOGRAPH-6D4B}) missing from current font.\n",
      "  func(*args, **kwargs)\n",
      "F:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\IPython\\core\\events.py:89: UserWarning: Glyph 35797 (\\N{CJK UNIFIED IDEOGRAPH-8BD5}) missing from current font.\n",
      "  func(*args, **kwargs)\n",
      "F:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\IPython\\core\\events.py:89: UserWarning: Glyph 39564 (\\N{CJK UNIFIED IDEOGRAPH-9A8C}) missing from current font.\n",
      "  func(*args, **kwargs)\n",
      "F:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\IPython\\core\\events.py:89: UserWarning: Glyph 35777 (\\N{CJK UNIFIED IDEOGRAPH-8BC1}) missing from current font.\n",
      "  func(*args, **kwargs)\n",
      "F:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 35757 (\\N{CJK UNIFIED IDEOGRAPH-8BAD}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "F:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 32451 (\\N{CJK UNIFIED IDEOGRAPH-7EC3}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "F:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 38598 (\\N{CJK UNIFIED IDEOGRAPH-96C6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "F:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 27979 (\\N{CJK UNIFIED IDEOGRAPH-6D4B}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "F:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 35797 (\\N{CJK UNIFIED IDEOGRAPH-8BD5}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "F:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 39564 (\\N{CJK UNIFIED IDEOGRAPH-9A8C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "F:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 35777 (\\N{CJK UNIFIED IDEOGRAPH-8BC1}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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Xn75ZQICAigqKiqzjhX70GfDSGBgIH369GHx4sWl5i9evJgBAwaUu07//v3LLL9o0SISExNxOBz1VmtN1aTH8qxdu5YWLVrUdXmW8LZ9WBc8ef+Zpsmdd97JggUL+Pbbb2nfvv1Z1/GmfViT/srjyfuwPKZpkp+fX+5n3rT/KlJZf+Xx5P03ZMgQkpOTSUpKKpkSExMZN24cSUlJ2O32MutYsg/r7dJYDzB37lzT4XCYs2fPNjdu3Gjec889ZlhYmJmSkmKapmk+9NBD5g033FCy/M6dO83Q0FDz3nvvNTdu3GjOnj3bdDgc5rx586xq4ayq2+MLL7xgLly40Ny6dau5fv1686GHHjIBc/78+Va1UKmsrCxz7dq15tq1a03AfP755821a9eau3fvNk3T+/dhdfvztv335z//2YyKijKXLFlipqamlky5ubkly3jzPqxJf962DydPnmwuW7bM3LVrl7lu3TpzypQpps1mMxctWmSapnfvP9Osfn/etv/Kc+ZoGk/Yhz4dRkzTNP/1r3+Zbdu2NQMDA83zzjuv1JC7G2+80bz44otLLb9kyRLz3HPPNQMDA8127dqZM2fObOCKq686Pf7jH/8wO3bsaAYHB5uNGjUyL7zwQvOzzz6zoOqqKR5Gd+Z04403mqbp/fuwuv152/4rrzfA/Pe//12yjDfvw5r052378Oabby7596VJkybmkCFDSn5Rm6Z37z/TrH5/3rb/ynNmGPGEfWiY5smrUkREREQs4LPXjIiIiIh3UBgRERERSymMiIiIiKUURkRERMRSCiMiIiJiKYURERERsZTCiIiIiFhKYUREREQspTAiIiIillIYEREREUspjIiIiIilFEZERETEUv8Pj6dz2PZzFNQAAAAASUVORK5CYII="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制损失\n",
    "plt.figure()\n",
    "plt.plot(his.history['loss'], label='训练集')\n",
    "plt.plot(his.history['val_loss'], label=\"测试集(验证集)\")\n",
    "plt.legend()\n",
    "plt.grid()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-14T14:10:35.045979700Z",
     "start_time": "2024-01-14T14:10:34.718172100Z"
    }
   },
   "id": "56f17b4aeba5e647"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "model.save('googLeNet.h5')"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "aadb00ba40a219c9"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
